package com.hd.trans.widgets.filter;

/**
 * @ClassName ： EmojiFilter
 * @Description: 表情过滤类
 * @date ： 2015-7-29 下午2:34:36
 */

public class EmojiFilter {

	/**
	 * 
	 * 是否包含表情
	 * 
	 * 
	 * 
	 * @author 杨振威 2015-3-26 下午2:41:08
	 * 
	 * @param codePoint
	 * 
	 * @return 如果不包含 返回false,包含 则返回true
	 */

	private static boolean isEmojiCharacter(char codePoint) {

		return !((codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA)

		|| (codePoint == 0xD)

		|| ((codePoint >= 0x20) && (codePoint <= 0xD7FF))

		|| ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF)));

	}

	/**
	 * 
	 * 过滤emoji 或者 其他非文字类型的字符
	 * 
	 * 
	 * 
	 * @author 杨振威 2015-3-26 下午2:42:11
	 * 
	 * @param source
	 * 
	 * @return
	 */

	public static String filterEmoji(String source) {

		StringBuilder buf = null;

		int len = source.length();

		for (int i = 0; i < len; i++) {

			char codePoint = source.charAt(i);

			if (!isEmojiCharacter(codePoint)) {// 如果不包含 则将字符append

				if (buf == null) {

					buf = new StringBuilder(source.length());

				}

				buf.append(codePoint);

			} else {

			}

		}

		if (buf == null) {

			return source;// 如果没有找到 emoji表情，则返回源字符串

		} else {

			if (buf.length() == len) {// 这里的意义在于尽可能少的toString，因为会重新生成字符串

				buf = null;

				return source;

			} else {

				return buf.toString();

			}

		}

	}

	/**
	 * 检测是否有emoji表情
	 * 
	 * @param source
	 * @return
	 */
	public static boolean containsEmoji(String source) {
		int len = source.length();
		for (int i = 0; i < len; i++) {
			char codePoint = source.charAt(i);
			if (isEmojiCharacter(codePoint)) { // 如果匹配,则该字符是Emoji表情
				return true;
			}
		}
		return false;
	}

}
